package Middlewares

import (
	"deepgox-go-admin/Pkg/HttpResponse"
	"fmt"
	"github.com/afex/hystrix-go/hystrix"
	"github.com/gin-gonic/gin"
)

type HystrixConfig struct {
	CommandName      string            // 熔断器名称
	Timeout          int               // 超时时间（毫秒）
	MaxConcurrency   int               // 最大并发数
	ErrorThreshold   int               // 错误率阈值（%）
	FallbackResponse gin.H             // 降级响应数据
	FallbackHandler  func(error) gin.H // 自定义降级处理函数（可选）
}

func HystrixMiddleware(config HystrixConfig) func(c *gin.Context) {
	// 配置熔断器参数
	hystrix.ConfigureCommand(config.CommandName, hystrix.CommandConfig{
		Timeout:                config.Timeout,
		MaxConcurrentRequests:  config.MaxConcurrency,
		ErrorPercentThreshold:  config.ErrorThreshold,
		RequestVolumeThreshold: 20,   // 统计窗口内最小请求数
		SleepWindow:            5000, // 熔断后尝试恢复的时间（毫秒）
	})

	return func(c *gin.Context) {
		err := hystrix.Do(config.CommandName, func() error {
			// 执行后续处理逻辑
			c.Next()
			// 检查响应状态码，非 2xx 视为错误
			if c.Writer.Status() >= 400 {
				return fmt.Errorf("request failed with status code: %d", c.Writer.Status())
			}
			return nil
		}, func(err error) error {
			// 降级处理
			if config.FallbackHandler != nil {
				HttpResponse.ResponseSuccess(c, err)
			} else {
				HttpResponse.ResponseSuccess(c, "熔断降级处理")
			}
			c.Abort()
			return nil
		})

		if err != nil {
			// 处理 hystrix 内部错误（如配置错误）
			//c.JSON(http.StatusInternalServerError, gin.H{"error": "hystrix execution error"})
			HttpResponse.ResponseError(c, HttpResponse.CondeConfigError)
			c.Abort()
		}
	}
}
